﻿#pragma once

#include "Cadena.h"
#include "Iterable.h"
#include "TipoRetorno.h"
#include "Tupla.h"

#include "IPais.h"
#include "ICiudad.h"
#include "IRecurso.h"

class ISistema abstract
{
public:
	virtual ~ISistema(){}

	// Tipo 1
	virtual TipoRetorno AltaPais(Cadena nombrePais) abstract;
	virtual TipoRetorno AltaCiudad(Cadena nombrePais, Cadena nombreCiudad, bool esCapital) abstract;
	virtual TipoRetorno AltaRecurso(Cadena nombrePais, Cadena nombreCiudad, Cadena recurso, int puntaje, int cantidad, int valor) abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<pPais>>> ImprimirJuego() const abstract;
	virtual Tupla<TipoRetorno, pRecurso> RecursoMasValioso(Cadena nombrePais, Cadena nombreCiudad) abstract;

	//// Tipo 2
	virtual TipoRetorno BuscarRecursos(Puntero<Iterable<Cadena>> recursos) const abstract;
	virtual TipoRetorno BorrarPais(Cadena nombrePais) abstract;
	virtual TipoRetorno BuscarRecMejorPuntaje(Puntero<Iterable<Cadena>> recursos) const abstract;
	virtual Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais, pCiudad>>>> CiudadesRecurso(Cadena recurso) const abstract;
	virtual Tupla<TipoRetorno, pPais> PaisMasCiudades() const abstract;

	//// Opcionales
	virtual TipoRetorno Importar(Cadena nombrePais, Cadena nombreCiudad, Cadena nombreRecurso, int cantidad) abstract;
};
